package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.*;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.cargo.ExtCproductService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/contract")
@Slf4j
public class ContractController extends BaseController{

    // 注入dubbo的服务接口的代理对象
    @Reference
    private ContractService contractService;

    @Reference
    private ExtCproductService extCproductService;

    @Reference
    private ContractProductService contractProductService;

    @Autowired
    private UserService userService;

    /**
     * 查询列表
     * ctrl + alt + o 导包、删除无用的包
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行用户分页的方法");

        // 构造查询对象
        ContractExample example = new ContractExample();
        // 根据create_time 创建时间，倒序排序
        example.setOrderByClause("create_time desc");
        // 条件集合
        ContractExample.Criteria criteria = example.createCriteria();
        // 添加查询条件：compnay_id
        criteria.andCompanyIdEqualTo(getLoginCompanyId());
        /**
         * 需求：细粒度的权限控制。不同的用户访问列表，看到的数据不一样
         * 用户的degree等级：
         *  0-saas管理员
         *  1-企业管理员
         *  2-管理所有下属部门和人员
         *  3-管理本部门
         *  4-普通员工
         */
        PageInfo<Contract> pageInfo = null;

        // 获取登陆用户
        User loginUser = getLoginUser();
        Integer degree = loginUser.getDegree();
        if (degree == 4){
            //1. 普通用户登陆，查看购销合同，只能查看自己创建的购销合同
            //SELECT * FROM co_contract WHERE create_by='登陆用户的id'
            criteria.andCreateByEqualTo(loginUser.getId());
            pageInfo = contractService.findByPage(example, pageNum, pageSize);
        }
        else if (degree == 3) {
            //2. 部门经理登陆，可以查看自己部门下所有员工创建的购销合同
            //SELECT * FROM co_contract WHERE create_dept='登陆用户的id'
            criteria.andCreateDeptEqualTo(loginUser.getDeptId());
            pageInfo = contractService.findByPage(example, pageNum, pageSize);
        } else if (degree == 2 || degree == 1) {
            //3. 大部门经理登陆（有子孙部门），可以查看所有子孙部门创建的购销合同
            pageInfo  = contractService.findContractsByDeptId(loginUser.getDeptId(),pageNum,pageSize);
        }

        // 存储查询结果
        request.setAttribute("pageInfo", pageInfo);

        return "cargo/contract/contract-list";
    }

    /**
     * 进入添加页面
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        return "cargo/contract/contract-add";
    }

    /**
     * 添加、修改
     */
    @RequestMapping("/edit")
    public String edit(Contract contract) {
        // 设置企业信息（先写死，后期从登陆用户动态获取）
        contract.setCompanyId(getLoginCompanyId());
        contract.setCompanyName(getLoginCompanyName());
        // 判断
        if (StringUtils.isEmpty(contract.getId())) {
            log.info("添加用户....");
            // 设置创建时间、创建人、创建人的部门
            contract.setCreateTime(new Date());
            contract.setCreateBy(getLoginUser().getId());
            contract.setCreateDept(getLoginUser().getDeptId());
            contractService.save(contract);
        } else {
            log.info("修改用户....");
            contractService.update(contract);
        }
        return "redirect:/cargo/contract/list";
    }

    /**
     * 进入修改页面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        // 根据id查询
        Contract contract = contractService.findById(id);
        // 保存
        request.setAttribute("contract", contract);
        return "cargo/contract/contract-update";
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    @ResponseBody
    public Map<String,Integer> delete(String id) {
        log.info("执行购销合同删除.....");
        Contract contract = contractService.findById(id);
        Integer extNum = contract.getExtNum();
        Integer proNum = contract.getProNum();
        Map<String,Integer> result=new HashMap<>();
        // System.out.println(contract.getState());
        //        contractService.delete(id);
        if (contract.getState()==0){
            if (extNum==0&&proNum==0){
                contractService.delete(id);
            }else {
                //附件数量不为0
                if (extNum!=0){
                    ExtCproductExample extCproductExample=new ExtCproductExample();
                    extCproductExample.createCriteria().andContractIdEqualTo(id);
                    //找到购销合同下所有的附件
                    List<ExtCproduct> extCproductList = extCproductService.findAll(extCproductExample);
                    for (ExtCproduct extCproduct : extCproductList) {
                        extCproductService.delete(extCproduct.getId());
                    }

                }
                //货物数量不为0
                if (proNum!=0){
                    //根据购销合同查询货物
                    ContractProductExample example=new ContractProductExample();
                    example.createCriteria().andContractIdEqualTo(id);
                    //找到购销合同下面所有的货物
                    List<ContractProduct> list = contractProductService.findAll(example);
                    //根据货物id删除货物
                    for (ContractProduct contractProduct : list) {
                        contractProductService.delete(contractProduct.getId());
                    }
                }
                contractService.delete(id);
            }
            //删除成功
            result.put("message",1);
        }else {
            //删除失败
            result.put("message",0);
        }
        return result;
        //return "redirect:/cargo/contract/list";
    }

    /**
     * 购销合同列表，点击：查看、提交、取消
     * http://localhost:8080/cargo/contract/toView.do?id=6
     * http://localhost:8080/cargo/contract/submit.do?id=6
     * http://localhost:8080/cargo/contract/cancel.do?id=6
     */
    @RequestMapping("/toView")
    public String toView(String id) {
        log.info("执行购销合同查看.....");
        Contract contract = contractService.findById(id);
        request.setAttribute("contract",contract);
        return "cargo/contract/contract-view";
    }

    @RequestMapping("/submit")
    public String submit(String id) {
        // 根据id查询
        Contract contract = contractService.findById(id);
        // 保存
        request.setAttribute("contract", contract);
        //获取购销合同的创建部门id
        String deptId = contract.getCreateDept();
        //通过部门id获取获取该部门的管理人员 审单人（degree等级 1.2.3）
        //   /**
        //         * 用户的degree等级：
        //         *  0-saas管理员
        //         *  1-企业管理员
        //         *  2-管理所有下属部门和人员
        //         *  3-管理本部门
        //         *  4-普通员工
        //         */
        List<User> userList = userService.findByDeptId(deptId);
        //保存
        request.setAttribute("userList",userList);
        return "cargo/contract/contract-view";

        /*log.info("执行购销合同提交.....");
        // 创建要更新的对象
        Contract contract = new Contract();
        // 设置更新条件
        contract.setId(id);
        // 设置更新的字段值: 提交，修改购销合同状态为1; 动态sql
        contract.setState(1);
        // 对象属性有值，才执行更新
        contractService.update(contract);
        return "redirect:/cargo/contract/list";*/
    }

    @RequestMapping("/cancel")
    public String cancel(String id) {
        log.info("执行购销合同提交.....");

        // 创建要更新的对象
        Contract contract = new Contract();
        // 设置更新条件
        contract.setId(id);
        // 设置更新的字段值: 取消，修改购销合同状态为0; 动态sql
        contract.setState(0);
        // 对象属性有值，才执行更新
        contractService.update(contract);
        return "redirect:/cargo/contract/list";
    }

    //选中审单人后保存 /cargo/contract/edit.do
    @RequestMapping("/check")
    public String check(Contract contract) {
        // 创建要更新的对象
        Contract contract1 = new Contract();
        // 设置更新条件
        contract1.setId(contract.getId());
        String checkBy = contract.getCheckBy();
        //判断登录用户名是否为审核人
        if (!checkBy.equals(getLoginUser().getUserName())){
            contract1.setState(3);
            contract1.setCheckBy(checkBy);
        }else{
            contract1.setState(1);
            contract1.setCheckBy(checkBy);
        }
        // 对象属性有值，才执行更新
        contractService.update(contract1);
        return "redirect:/cargo/contract/list";
    }
}











